
/*-----------------------------------------------------------------------------\
|                          ChipCFlow Block2Code V2.0                           |
|                                                                              |
| Desenvolvedor: Felipe Simões Lage Gomes Duarte                               |
| Orientador: Prof. Dr. Jorge Luiz e Silva                                     |
|                                                                              |
| Main Project: ChipCflow                                                      |
| Período: Agosto de 2010 a Julho de 2011                                      |
| Codigo: Main.java                                                            |
| Versão da IDE: NetBeans IDE 6.9.1 (Build 201011082200)                       |
| Java: 1.6.0_21; Java HotSpot(TM) Client VM 17.0-b17                          |
| Sistema Operacional: Windows 7 versão 6.1 executando em x86; pt_BR (nb)      |
|                                                                              |
|             O presente trabalho foi realizado com apoio do CNPq              |
|   Conselho Nacional de Desenvolvimento Científico  e Tecnológico - Brasil    |
\-----------------------------------------------------------------------------*/

package components;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;

public class Op_Generico extends Operadores {

  private String nomeArquivo;
  private int numEntrada;
  private int numSaida;
  private String source;

  public Op_Generico(String nomeArquivo, String source, int numEntrada, int numSaida) {
    super();
    this.nomeArquivo = nomeArquivo;
    this.numEntrada = numEntrada;
    this.numSaida = numSaida;
    for(int i=0;i<numEntrada;i++)
      this.bar.add(new Conector(Conector.IN, new Point(0,0)));
    for(int i=0;i<numSaida;i++)
      this.bar.add(new Conector(Conector.OUT, new Point(0,0)));    
  }
  
  public Op_Generico(Op_GenericoData op_genericodata) {
    super();
    this.nomeArquivo = op_genericodata.getNomeArquivo();
    this.source = op_genericodata.getSource();
    this.numEntrada = op_genericodata.getNumEntrada();
    this.numSaida = op_genericodata.getNumSaida();
    for(int i=0;i<numEntrada;i++)
      this.bar.add(new Conector(Conector.IN, new Point(0,0)));
    for(int i=0;i<numSaida;i++)
      this.bar.add(new Conector(Conector.OUT, new Point(0,0)));    
  }

  public String getNomeArquivo() {
    return nomeArquivo;
  }

  public void setNomeArquivo(String nomeArquivo) {
    this.nomeArquivo = nomeArquivo;
  }

  public int getNumEntrada() {
    return numEntrada;
  }

  public void setNumEntrada(int numEntrada) {
    this.numEntrada = numEntrada;
  }

  public int getNumSaida() {
    return numSaida;
  }

  public void setNumSaida(int numSaida) {
    this.numSaida = numSaida;
  }

  @Override
  public void desenha(Graphics2D g) {
    int max = (this.numEntrada > this.numSaida) ? this.numEntrada : this.numSaida;
    int x = getMx();
    int y = getMy();
    int xAmort = (15 +  max*2); //calor calculado para que cresça horizontalmente a medida que
                                //cresce verticalmente
    int yAmort = (max * 10); // valor calculado para crescimento vertical

    g.rotate(this.getRotacao(), x, y);
    //g.rotate(90,this.getMx(), this.getMy());

    this.setCor(Color.BLACK);
    g.setStroke(new BasicStroke(2));
    g.setColor(this.getCor());

    g.drawLine(x - xAmort , y - yAmort, x + xAmort, y - yAmort);//desenha linha de cima
    g.drawLine(x - xAmort , y + yAmort, x + xAmort, y + yAmort);//desenha linha de baixo
    g.drawLine(x - xAmort , y - yAmort, x - xAmort, y + yAmort);//desenha linha da esquerda
    g.drawLine(x + xAmort , y - yAmort, x + xAmort, y + yAmort);//desenha linha da direita

    //desenha barramentos de entrada
    for(int i = 0; i<numEntrada; i++){
      int aux = (y - yAmort) + i*(int)((2*yAmort)/max) + 10;
      g.drawLine(x - xAmort , aux , x - (xAmort + 10), aux);//desenha linha de cima
    }

    //desenha barramentos de saida
    for(int i = 0; i<numSaida; i++){
      int aux = (y - yAmort) + i*(int)((2*yAmort)/max) + 10;
      g.drawLine(x + xAmort , aux , x + (xAmort + 10), aux);//desenha linha de cima
    }
  }

  @Override
  public boolean procuraForma(int X, int Y) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public void updateBarName() {
    this.setOpName("Op" + Integer.toString(numInstancia) + "_Generic");
    numInstancia++;
  }
}
